#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int val) : val(val), next(nullptr) {} 
};

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyNode = new ListNode(0);
        dummyNode->next = head;
        ListNode*cur = dummyNode;

        while(cur->next != nullptr && cur->next->next != nullptr) {
            ListNode* tmp1 = cur->next; // 保存节点1
            ListNode* tmp2 = cur->next->next->next; // 保存节点3

            cur->next = cur->next->next;    // 步骤1：cur->next 指向 节点2
            cur->next->next = tmp1;         // 步骤2：节点2 指向 节点1
            //cur->next->next->next = tmp2;
            tmp1->next = tmp2;              // 步骤3：节点1 指向 节点3

            cur = cur->next->next;
        }
        return dummyNode->next;
    }
};

ListNode* createNode(int val) {
    return (new ListNode(val));
}

void printNode(ListNode* head) {
    ListNode* cur = head;
    while(cur) {
        cout << cur->val << " ";
        cur = cur->next;
    }
    cout << endl;
}

int main(void) {
    ListNode* head = createNode(1);
    ListNode* node1 = createNode(2);
    ListNode* node2 = createNode(3);
    ListNode* node3 = createNode(4);
    ListNode* node4 = createNode(5);
    ListNode* node5 = createNode(6);

    head->next = node1;
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;

    printNode(head);

    Solution s;
    head = s.swapPairs(head);
    printNode(head);

    return 0;
}
